package net.fltx.taskmgr.win32api;

import com.sun.jna.Structure;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;

/**
 * 描述属于指定进程的模块列表中的条目。
 */
public class ModuleEntry32 extends Structure {

    public int dwSize=808;//指定结构的长度
    public int th32ModuleID;//此成员已经不再被使用，通常被设置为1
    public int th32ProcessID;//进程id
    public int GlblcntUsage;//全局模块的使用计数，即模块的总载入次数。
    public int ProccntUsage;//全局模块的使用计数
    public long modBaseAddr;//模块的基址，在其所属的进程范围内。
    public int modBaseSize;//模块的大小，单位字节。
    public long hModule;//所属进程的范围内，模块句柄。
    public byte[] szModule = new byte[256];//NULL结尾的字符串，其中包含模块名。
    public byte[] szExePath = new byte[512];//NULL结尾的字符串，其中包含的位置，或模块的路径。

    @Override
    protected List<String> getFieldOrder() {
        return Arrays.asList(new String[]{"dwSize", "th32ModuleID", "th32ProcessID", "GlblcntUsage", "ProccntUsage",
                "modBaseAddr", "modBaseSize", "hModule", "szModule", "szExePath"});
    }

    public ModuleEntry32 free(){
        szModule=new byte[szModule.length];
        szExePath=new byte[szExePath.length];
        return this;
    }


    public String getSzModule(){
        String Module="";
        try {
            Module=(new String(szModule,"gbk")).trim();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return Module;
    }


    public String getSzExePath() {
        String ExePath="";
        try {
            ExePath=(new String(szExePath,"gbk")).trim();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return ExePath;
    }


    @Override
    public String toString() {
        return "ModuleEntry32{" +
                "dwSize=" + dwSize +
                ", th32ModuleID=" + th32ModuleID +
                ", th32ProcessID=" + th32ProcessID +
                ", GlblcntUsage=" + GlblcntUsage +
                ", ProccntUsage=" + ProccntUsage +
                ", modBaseAddr=" + modBaseAddr +
                ", modBaseSize=" + modBaseSize +
                ", hModule=" + hModule +
                ", szModule=" + getSzModule() +
                ", szExePath=" + getSzExePath() +
                '}';
    }
}
